import Combine
import Foundation
+import NextcloudFileProviderKit
import NextcloudKit
import OSLog
class ShareController: ObservableObject {
@Published private(set) var share: NKShare
private let kit: NextcloudKit
+ private let account: Account
static func create(
+ account: Account,
kit: NextcloudKit,
shareType: NKShare.ShareType,
itemServerRelativePath: String,
publicUpload: publicUpload,
password: password,
permissions: permissions,
+ account: account.ncKitAccount,
options: options
) { account, share, data, error in
defer { continuation.resume(returning: error) }
shareWith: shareWith,
password: password,
permissions: permissions,
- options: options,
- attributes: attributes
+ attributes: attributes,
+ account: account.ncKitAccount
) { account, share, data, error in
defer { continuation.resume(returning: error) }
guard error == .success else {
}
}
- init(share: NKShare, kit: NextcloudKit) {
+ init(share: NKShare, account: Account, kit: NextcloudKit) {
+ self.account = account
self.share = share
self.kit = kit
}
label: label,
hideDownload: hideDownload,
attributes: attributes,
+ account: account.ncKitAccount,
options: options
) { account, share, data, error in
Logger.shareController.info(
func delete() async -> NKError? {
Logger.shareController.info("Deleting share: \(self.share.url, privacy: .public)")
return await withCheckedContinuation { continuation in
- kit.deleteShare(idShare: share.idShare) { account, error in
+ kit.deleteShare(
+ idShare: share.idShare, account: account.ncKitAccount
+ ) { account, _, error in
Logger.shareController.info(
"""
Received delete response: \(self.share.url, privacy: .public)
import AppKit
import Combine
+import NextcloudFileProviderKit
import NextcloudKit
import OSLog
import SuggestionsTextFieldKit
@IBOutlet private weak var circleShare: NSMenuItem!
@IBOutlet private weak var talkConversationShare: NSMenuItem!
- var kit: NextcloudKit? {
+ let kit = NextcloudKit.shared
+ var account: Account? {
didSet {
- Logger.shareOptionsView.info("Setting up the kit.")
- guard let kit = kit else {
+ Logger.shareOptionsView.info("Setting up account.")
+ guard let account else {
Logger.shareOptionsView.error("Could not configure suggestions data source.")
return
}
suggestionsTextFieldDelegate.suggestionsDataSource = ShareeSuggestionsDataSource(
- kit: kit
+ account: account, kit: kit
)
suggestionsTextFieldDelegate.confirmationHandler = { suggestion in
guard let sharee = suggestion?.data as? NKSharee else { return }
guard !createMode else {
Logger.shareOptionsView.info("Creating new share!")
- guard let dataSource = dataSource,
- let kit = kit,
+ guard let dataSource,
+ let account,
let itemServerRelativePath = dataSource.itemServerRelativePath
else {
Logger.shareOptionsView.error("Cannot create new share due to missing data.")
Logger.shareOptionsView.error("dataSource: \(self.dataSource, privacy: .public)")
- Logger.shareOptionsView.error("kit: \(self.kit, privacy: .public)")
+ Logger.shareOptionsView.error("account: \(self.account != nil, privacy: .public)")
Logger.shareOptionsView.error(
"path: \(self.dataSource?.itemServerRelativePath ?? "", privacy: .public)"
)
deleteButton.isEnabled = false
saveButton.isEnabled = false
let error = await ShareController.create(
+ account: account,
kit: kit,
shareType: selectedShareType,
itemServerRelativePath: itemServerRelativePath,
private let shareItemViewNib = NSNib(nibNamed: "ShareTableItemView", bundle: nil)
private let reattemptInterval: TimeInterval = 3.0
+ let kit = NextcloudKit.shared
+
var uiDelegate: ShareViewDataSourceUIDelegate?
var sharesTableView: NSTableView? {
didSet {
var capabilities: Capabilities?
var itemMetadata: NKFile?
- private(set) var kit: NextcloudKit?
private(set) var itemURL: URL?
private(set) var itemServerRelativePath: String?
private(set) var shares: [NKShare] = [] {
didSet { Task { @MainActor in sharesTableView?.reloadData() } }
}
- private var account: Account? {
+ private(set) var account: Account? {
didSet {
guard let account = account else { return }
- kit = NextcloudKit()
- kit?.setup(
+ kit.appendSession(
+ account: account.ncKitAccount,
+ urlBase: account.serverUrl,
user: account.username,
userId: account.username,
password: account.password,
- urlBase: account.serverUrl
+ userAgent: "Nextcloud-macOS/FileProviderUIExt",
+ nextcloudVersion: 25,
+ groupIdentifier: ""
)
}
}
presentError("Server does not support shares.")
return
}
- guard let kit else {
- presentError("NextcloudKit instance is unavailable, cannot reload data!")
+ guard let account else {
+ presentError("Account data is unavailable, cannot reload data!")
return
}
- itemMetadata = await fetchItemMetadata(itemRelativePath: serverPathString, kit: kit)
+ itemMetadata = await fetchItemMetadata(
+ itemRelativePath: serverPathString, account: account, kit: kit
+ )
guard itemMetadata?.permissions.contains("R") == true else {
presentError("This file cannot be shared.")
return
let rawIdentifier = itemIdentifier.rawValue
Logger.sharesDataSource.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
- guard let kit = kit else {
- self.presentError("NextcloudKit instance is unavailable, cannot fetch shares!")
+ guard let account else {
+ self.presentError("NextcloudKit instance or account is unavailable, cannot fetch shares!")
return []
}
let parameter = NKShareParameter(path: itemRelativePath)
return await withCheckedContinuation { continuation in
- kit.readShares(parameters: parameter) { account, shares, data, error in
+ kit.readShares(
+ parameters: parameter, account: account.ncKitAccount
+ ) { account, shares, data, error in
let shareCount = shares?.count ?? 0
Logger.sharesDataSource.info("Received \(shareCount, privacy: .public) shares")
defer { continuation.resume(returning: shares ?? []) }
}
private func fetchCapabilities() async -> Capabilities? {
+ guard let account else {
+ self.presentError("Could not fetch capabilities as account is invalid.")
+ return nil
+ }
+
return await withCheckedContinuation { continuation in
- kit?.getCapabilities { account, capabilitiesJson, error in
- guard error == .success, let capabilitiesJson = capabilitiesJson else {
+ kit.getCapabilities(account: account.ncKitAccount) { account, data, error in
+ guard error == .success, let capabilitiesJson = data?.data else {
self.presentError("Error getting server caps: \(error.errorDescription)")
continuation.resume(returning: nil)
return
}
@IBAction func createShare(_ sender: Any) {
- guard let kit = shareDataSource.kit else { return }
- optionsView.kit = kit
+ guard let account = shareDataSource.account else { return }
+ optionsView.account = account
optionsView.createMode = true
tableView.deselectAll(self)
if !splitView.arrangedSubviews.contains(optionsView) {
}
func showOptions(share: NKShare) {
- guard let kit = shareDataSource.kit else { return }
- optionsView.kit = kit
- optionsView.controller = ShareController(share: share, kit: kit)
+ guard let account = shareDataSource.account else { return }
+ optionsView.account = account
+ optionsView.controller = ShareController(
+ share: share, account: account, kit: shareDataSource.kit
+ )
if !splitView.arrangedSubviews.contains(optionsView) {
splitView.addArrangedSubview(optionsView)
optionsView.isHidden = false
//
import Foundation
+import NextcloudFileProviderKit
import NextcloudKit
import OSLog
import SuggestionsTextFieldKit
class ShareeSuggestionsDataSource: SuggestionsDataSource {
let kit: NextcloudKit
+ let account: Account
var suggestions: [Suggestion] = []
var inputString: String = "" {
didSet { Task { await updateSuggestions() } }
}
- init(kit: NextcloudKit) {
+ init(account: Account, kit: NextcloudKit) {
+ self.account = account
self.kit = kit
}
search: inputString,
page: 1,
perPage: 20,
+ account: account.ncKitAccount,
completion: { account, sharees, data, error in
defer { continuation.resume(returning: sharees ?? []) }
guard error == .success else {